#ifndef __MAP_H__
#define __MAP_H__

#include <string.h>
#include <vector>
using std::vector;

#include "Serializable.h"

#include "MapParser.h"
#include "Vakje.h"

//! Een 'map' (ned: kaart) van de fabriek.
/*!
  Een tweedimensionele array van vakjes.
  De map zal ervoor zorgen dat de vakjes die aangemaakt zijn met 'new' gedeletet worden.
  De map zal aangemaakt worden door een factory die een bestand inleest en hieruit de map aanmaakt.
  Aangezien de map Serializable is, kan deze via netwerkverstuurd worden.
  \author Maarten Lambert, Kenneth Venken
*/

class Kaart;

class Map : public Serializable
{
public:
	Map(){m_breedte = m_hoogte = 0;}
	~Map(){ clear(); }
	Map( const Map& map );

	// zet mapnaam om in gevulde vakjes
	// mapnaam is de identifier van de map
	void loadMap(string mapNaam);

	//! geeft het vakje op positie (x, y)
	const Vakje* getVakje(size_t x, size_t y) const { return m_grid[x][y]; }
	//Vakje* getVakje(size_t x, size_t y) { return m_grid[x][y]; }
	void setVakje(size_t x, size_t y, Vakje* vakje) { m_grid[x][y] = vakje; }
	
	/*!
		heeft vorm: "<header>:<version>:<width>,<height>,<<rij><rij>...<rij>>:<naam>" 
	*/
	string serialize() const {return string("TEST"); }
	bool unserialize(const string&){return 1;}
	const string& getNaam() const { return m_naam; }
	void setNaam(const string& naam) { m_naam = naam; }

	size_t width() const { return m_breedte; }
	size_t height() const { return m_hoogte; }

	void clear()
	{
		for( size_t x = 0; x < width(); x++)
			for( size_t y = 0; y < height(); y++)
			{
				delete m_grid[x][y];
				m_grid[x][y] = NULL;
			}
		m_breedte = m_hoogte = 0;
	}

public:
	void resize(size_t width, size_t height)
	{	
		clear();
		m_grid.resize( width );
		for( size_t x = 0; x < width; x++)
		{
			m_grid[x].resize( height );
			for(size_t y = 0; y < height; y++)
				m_grid[x][y] = NULL;
		}

		m_breedte = width;
		m_hoogte = height;
	}

private:
	//! 2-dimensionele array van vakjes.
	vector< vector< Vakje* > > m_grid;

	string m_naam;
	int m_breedte;
	int m_hoogte;

};

#endif
